iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
Software Development

邁向專業軟體工程師必修的英文課系列 第 21

Day 21 - [連接詞三] And and Or,And or Or ?

  • 分享至 

  • xImage
  •  

在英文裡,連接詞用來連接字、句、詞或段落。而在程式裡也常會用到連接詞,這篇要講的是兩個最常用的連接詞:And及Or。

And和Or在判斷式裡使用頻率非常的高,特別在迴圈及判斷式裡都會使用到,比較常會用到的是他的語法型:|或者&。但這麼常用的語法,如果放在其他地方,卻是一個非常不好的習慣。

我們從一個微軟的常用方法開始說起:string.IsNullOrEmpty()

可以在方法命名中間And或Or嗎

這是一個檢查字串是否是空字串的方法,如果傳進去的字串是null或是"",他會回傳true

public static bool IsNullOrEmpty(string value)
{
  return value == null || value.Length == 0;
}

就算不看原始碼,其實也很容易測試這個方法,因為字串是個很基本的型態。
另外還有一個方法,叫GetStringAndRelease,其實他就是回傳己經接好的字串,然後把放在cache裡。

public static string GetStringAndRelease(StringBuilder sb)
{
  string str = sb.ToString();
  StringBuilderCache.Release(sb);
  return str;
}

因為有這些例子,就表示在方法的命名裡放進And或Or嗎?

為什麼不能放And或Or在方法名稱裡?

其實在名稱裡放And或Or並不是一件被鼓勵的行為,因為他會增加方法的複雜度。
什麼意思呢?假設有一個會員系統,每個會員在登入後,每天都會拿到一個coin當成獎勵,於是工程師就寫了一個方法叫

public void LoginAndGiveCoin();

但當系統運行一陣子之後,規則修改了:拿到coin的會員只有付費會員以及透過Affiliate註冊的會員才能拿到,這時候我們就要開始思考如何修改:

  • 進到LoginAndGiveCoin()的方法裡,增加檢查會員的邏輯
  • 在呼叫LoginAndGiveCoin()前檢查會員的資格

有看出問題了嗎?
原本的方法包含了商業邏輯,然而當邏輯不存在時,工程師並不會思考「這個邏輯己經不存在了」,而會去想「怎麼讓這新的商業邏輯相容在現有的程式片段裡」。這種破片不但會增加程式的複雜度,還會導致維護的人誤解程式的使用。所以And或Or在命名上很容易違反「單一功能原則」,以上面的例子來看,修改LoginAndGiveCoin的原因不是因為Login的規則改變了,也不是因為GiveCoin的規則改變了,而是因為第三個原因:GiveCoin的資格改變了。

回到最一開始的例子,IsNullOrEmpty(),因為他如此的簡單,因此可以接受命名裡有Or,但如果這個方法的規則改變了:例如數字要排除,空白要排除...那同樣的道理,基於「單一功能原則」,這個命名就很不恰當:因為"123 "並不是空白字串,但呼叫這個方法時會得到true。

其實And和Or的名稱真的很常見,但使用上要特別注意,如果不確定是否能合併,最好的方法還是找另一個人一起Pair,討論看看命名的合理性。


上一篇
Day 20 - [連接詞二] 想好好討論一下if的用法 - 2
下一篇
Day 22 - [連接詞四] 三個工程師必需具備的邏輯常識
系列文
邁向專業軟體工程師必修的英文課30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言